package com.mycompany.crm.interceptor;

import com.mycompany.crm.dao.UserMapper;
import com.mycompany.crm.exceptions.NoLoginException;
import com.mycompany.crm.utils.LoginUserUtil;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author jy
 * @version 1.0
 * @date 2022/1/5 19:36
 */
public class NoLoginInterceptor extends HandlerInterceptorAdapter {

    @Resource
    private UserMapper userMapper;

    /**
     * 拦截用户是否是登录状态(在目标方法(目标资源)执行前执行的方法)
     *
     * 如何判断用户是否处于登录状态呢?
     *    1.判断cookie中是否存在用户信息(获取用户id)
     *    2.数据库中是否存在指定用户id的值
     * 如果用户是登录状态则放行，反之则抛出未登录异常(NoLoginException)
     * 在全局异常中做判断，如果是未登录状态，则跳转到登录页面
     *
     * @param request
     * @param response
     * @param handler
     * @return false表示阻止目标方法执行  true表示放行
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        // 获取cookie中的用户ID
        Integer userId = LoginUserUtil.releaseUserIdFromCookie(request);
        //判断userId是否为空，且数据库中存在该ID的用户记录
        if (userMapper.selectByPrimaryKey(userId) == null){
            throw new NoLoginException();
        }
        return true;
    }
}
